/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.trandio.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.naming.NamingException;
import org.trandio.hb.TbLiquidacion;
import org.trandio.model.DetalleFacturaVO;
import org.trandio.model.FacturaVO;
import org.trandio.model.GrupoEdadVO;
import org.trandio.util.ConexionDb;
import org.trandio.util.HibernateUtil;
import org.hibernate.Query;
import org.hibernate.Session;

/**
 *
 * @author root
 */
 public class LiquidacionDAO implements LiquidacionInterface {
     
     
     private Session sesion;
     

    @Override
    public float calcularCopago(String idcto, String servicio, String grupoact, String nivel) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        float valordesc = 0;

                 String sql = "SELECT " +
                         "tb_copagos.n"+nivel+
                         " FROM " +
                         "tb_grupoactividad_copago " +
                         "INNER JOIN tb_copagos ON (tb_grupoactividad_copago.id_copagos=tb_copagos.id) " +
                         "WHERE " +                         
                         " tb_grupoactividad_copago.id_grupoactividad=" +grupoact+
                         " and tb_grupoactividad_copago.id_contrato="+idcto;

        System.out.println("Sql buscar descuento: "+sql);

        PreparedStatement stmt = conn.prepareStatement(sql);        
        try{
        ResultSet res = stmt.executeQuery();
        try{

        if (res.next()) {
                valordesc = res.getFloat("n"+nivel);
        }
        }finally{
         res.close();
        }
        }finally{
         stmt.close();
            if (!conn.isClosed())
               conn.close();

        }
        return valordesc;
    }

    @Override
    public int setCabecera(String idpaciente, int idsede, String identidad, String idcontrato, String idservicio, String iddetalleturno, String estado, String impresa, String idfunc, String numero, String fecha) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

       

        String sqlAdiciona  ="INSERT INTO tb_factura(observacion, id_paciente, id_sede, id_entidad,"
                + "id_contrato, fecha, id_servicio, id_usuario, id_detalleturno, "
                + "estado, impresa,numero) "
                + "VALUES (?, ?, ?, ?,?,'"+fecha+"', ?, ?, ?,?, ?,?) RETURNING id;";

        
        System.out.println("Fecha: "+fecha);
        
        
        PreparedStatement stmt = conn.prepareStatement(sqlAdiciona);      

        stmt.setString(1,"NA");
        stmt.setInt(2,Integer.parseInt(idpaciente));
        stmt.setInt(3,idsede);
        stmt.setInt(4,Integer.parseInt(identidad));
        stmt.setInt(5,Integer.parseInt(idcontrato));
        stmt.setInt(6,Integer.parseInt(idservicio));
        stmt.setInt(7,Integer.parseInt(idfunc));
        stmt.setInt(8,Integer.parseInt(iddetalleturno));
        stmt.setString(9,estado);
        stmt.setString(10,impresa);
        stmt.setString(11,numero);

        ResultSet rs = stmt.executeQuery();

        rs.next();

        int resp = rs.getInt(1);
        
        System.out.println("Insert Generar: "+resp);

	stmt.close();
        if (!conn.isClosed())
               conn.close();

        return resp;
    }

    @Override
    public int setDetalles(String idfact, String idact, String vrunit, String vrsubsidio, String vrcopago, String cantidad, String total,String idmedico) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();
        float vrunitario = 0;
        vrunitario = Float.parseFloat(total);
        vrunitario = vrunitario / Integer.parseInt(cantidad);
        /*
        String sqlAdiciona  ="INSERT INTO tb_detalle_factura(id_factura, id_actividad, valor_unitario, valor_subsidio," +
                "valor_copago, cantidad, valor_total, id_detallepadre, id_medico,id_especialidad) " +
                "VALUES ("+idfact+","+idact+","+vrunitario+","+Float.parseFloat(vrsubsidio)+","+Float.parseFloat(vrcopago)+","+cantidad+","+Float.parseFloat(total)+",0,"+Integer.parseInt(idmedico)+",0);";

        System.out.println("Insertar Detalles: "+sqlAdiciona );
        Statement stmt = conn.createStatement();
        stmt.executeUpdate(sqlAdiciona);
        */
        String sqlAdiciona  ="INSERT INTO tb_detalle_factura(id_factura, id_actividad, valor_unitario, valor_subsidio," +
                "valor_copago, cantidad, valor_total, id_detallepadre, id_medico,id_especialidad) " +
                "VALUES (?,?,?,?,?,?,?,?,?,?) RETURNING id;";

        PreparedStatement stmt = conn.prepareStatement(sqlAdiciona);

        stmt.setInt(1, Integer.parseInt(idfact));
        stmt.setInt(2, Integer.parseInt(idact));
        stmt.setFloat(3, Float.parseFloat(vrunit));
        stmt.setFloat(4, Float.parseFloat(vrsubsidio));
        stmt.setFloat(5, Float.parseFloat(vrcopago));
        stmt.setInt(6, Integer.parseInt(cantidad));
        stmt.setFloat(7, Float.parseFloat(total));
        stmt.setInt(8, 0);
        stmt.setInt(9, Integer.parseInt(idmedico));
        stmt.setInt(10, 0);


        ResultSet rs = stmt.executeQuery();
        rs.next();
        int resp = rs.getInt(1);

	stmt.close();
        if (!conn.isClosed())
               conn.close();

        return resp;


    }

    @Override
    public FacturaVO consultarFactura(String idfactura) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();



        String sql = "SELECT tb_factura.id,tb_factura.numero, tb_prestador.codigo, " +
                "tb_prestador.razon_social, tb_prestador.nit, " +
                "tb_entidad.cod_entidad, tb_entidad.descripcion, " +
                "tb_paciente.numero_identificacion, tb_paciente.nombre1, " +
                "tb_paciente.nombre2, tb_paciente.apellido1, tb_paciente.apellido2,"
                +"tb_paciente.edad,tb_sexo.descripcion sexo," +
                "tb_factura.fecha," +
                "tb_departamento.descripcion depto," +
                "tb_municipio.descripcion mupio," +
                "tb_paciente.id idpaciente" +
                " FROM " +
                "public.tb_factura," +
                "public.tb_paciente," +
                "public.tb_sede," +
                "public.tb_prestador," +
                "public.tb_entidad," +
                "public.tb_contrato," +
                "public.tb_usuario," +
                "public.tb_municipio," +
                "public.tb_sexo," +
                "public.tb_departamento" +
                " WHERE tb_factura.id_paciente = tb_paciente.id AND" +
                " tb_factura.id_sede = tb_sede.id and "+
                " tb_sede.id_prestador = tb_prestador.id AND "+               
                " tb_factura.id_entidad = tb_entidad.id_entidad AND" +
                " tb_factura.id_contrato = tb_contrato.id AND" +
                " tb_municipio.id = tb_prestador.id_municipio AND" +
                " tb_departamento.id = tb_prestador.id_departamento AND" +
                " tb_factura.id_usuario = tb_usuario.id AND" +
                " tb_paciente.id_sexo = tb_sexo.id" +
                " AND tb_factura.id = "+idfactura;

        System.out.println("Sql BUSCAR ACTIVIDAD POR ID: "+sql);

        PreparedStatement stmt = conn.prepareStatement(sql);
        ResultSet res = stmt.executeQuery();

        FacturaVO facturaVO = new FacturaVO();

        if (res.next()) {
                facturaVO.setIdfactura(res.getString("id"));
                facturaVO.setDescprestador(res.getString("razon_social"));
                facturaVO.setDescentidad(res.getString("descripcion"));
                facturaVO.setFecha(res.getString("fecha"));
                facturaVO.setPaciente(res.getString("nombre1")+" "+res.getString("nombre2")+" "+res.getString("apellido1")+" "+res.getString("apellido2"));
                facturaVO.setCodips(res.getString("codigo"));
                facturaVO.setDepto(res.getString("depto"));
                facturaVO.setMupio(res.getString("mupio"));
                facturaVO.setIdpaciente(res.getInt("idpaciente"));
                facturaVO.setNitips(res.getString("nit"));
                facturaVO.setNumfactura(res.getString("numero"));
                facturaVO.setNumIde(res.getString("numero_identificacion"));
                facturaVO.setSexoPac(res.getString("sexo"));
                facturaVO.setEdadPac(res.getString("edad"));

            }

         res.close();
         stmt.close();
         if (!conn.isClosed())
               conn.close();
        return facturaVO;
    }

    @Override
    public List<DetalleFacturaVO> consultarDetallesFactura(String idfactura) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        List<DetalleFacturaVO> listDetalleFactura = new ArrayList<DetalleFacturaVO>();

        String condicion = "";


        String sql = "SELECT tb_actividad.codigo, " +
                "tb_actividad.descripcion," +
                "tb_detalle_factura.valor_unitario," +
                "tb_detalle_factura.cantidad," +
                "tb_detalle_factura.valor_copago," +
                "tb_detalle_factura.valor_subsidio," +
                "tb_detalle_factura.valor_total " +
                "FROM tb_detalle_factura " +
                "INNER JOIN tb_actividad ON (tb_detalle_factura.id_actividad = tb_actividad.id) " +
                "WHERE tb_detalle_factura.id_factura="+idfactura;

        System.out.println("Sql buscar DETALLES FACT: "+sql);

        PreparedStatement stmt = conn.prepareStatement(sql);
        
        try {
            ResultSet res = stmt.executeQuery();
            try {
                while (res.next()) {
                    DetalleFacturaVO detalleFacturaVO = new DetalleFacturaVO();
                    detalleFacturaVO.setCodigo(res.getString("codigo"));
                    detalleFacturaVO.setDescripcion(res.getString("descripcion"));
                    detalleFacturaVO.setTarifa(res.getFloat("valor_unitario"));
                    detalleFacturaVO.setVrunitario(res.getFloat("valor_unitario"));
                    detalleFacturaVO.setVrpaciente(res.getFloat("valor_copago"));
                    detalleFacturaVO.setVraseguradora(res.getFloat("valor_subsidio"));
                    detalleFacturaVO.setVrtotal(res.getFloat("valor_total"));
                    detalleFacturaVO.setCantidad(res.getInt("cantidad"));
                    listDetalleFactura.add(detalleFacturaVO);

                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
           if (!conn.isClosed())
               conn.close();
        }

        return listDetalleFactura;
    }

    @Override
    public void actualizarConsFact(int numero_factura) throws SQLException, NamingException {
         ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String sql = "UPDATE tb_configuracion"+
                     " SET cons_actfact=?";

                System.out.println("SQL del Update config="+sql);

		PreparedStatement stmt = conn.prepareStatement(sql);

                stmt.setInt(1,numero_factura);

                stmt.execute();
		stmt.close();
    }

    @Override
    public int getCantReglas(String $sWhere) {
        sesion = HibernateUtil.getSessionFactory().openSession();        
        Query q;        
        sesion.beginTransaction();        
        q = sesion.createQuery("from TbLiquidacion "+$sWhere);
        return q.list().size();
    }

    @Override
    public List<TbLiquidacion> getReglas(int displayStart, int displayLength, String $sWhere, String orden) {
        sesion = HibernateUtil.getSessionFactory().openSession();        
        List<TbLiquidacion> lista = new ArrayList<TbLiquidacion>();
        
        Query q;
        sesion.beginTransaction();        
        q = sesion.createQuery("from TbLiquidacion "+$sWhere+orden);        
        lista = q.list();               
        return lista;                   
    }

    @Override
    public TbLiquidacion getRegla(int id) {
        sesion = HibernateUtil.getSessionFactory().openSession();        
        TbLiquidacion objeto = null;
        
        Query q;
        sesion.beginTransaction();        
        q = sesion.createQuery("from TbLiquidacion where id="+id);        
        objeto = (TbLiquidacion) q.uniqueResult();
        return objeto;   
    }

    @Override
    public void setLiquidacion(TbLiquidacion liquidacion) {
        sesion = HibernateUtil.getSessionFactory().openSession();                
        sesion.beginTransaction();
        sesion.saveOrUpdate(liquidacion);       
        
        sesion.getTransaction().commit();
        sesion.close();                
    }

    @Override
    public boolean validarRegla(TbLiquidacion liquidacion) {
        sesion = HibernateUtil.getSessionFactory().openSession();        
        
        boolean cant = true;
               
        Query q;
        sesion.beginTransaction();        
        q = sesion.createQuery("from TbLiquidacion where idtipoUsuario=? "                
                + "AND idtipoAfiliacion=? "
                + "AND idNivel=? "
                + "AND idSexo=? "
                + "AND idServicio=? "
                + "AND idgrupoEdad=? "
                + "AND idtipoPoblacion=?")                
                .setInteger(0,liquidacion.getIdtipoUsuario())
                .setInteger(1,liquidacion.getIdtipoAfiliacion())
                .setInteger(2,liquidacion.getIdNivel())
                .setInteger(3,liquidacion.getIdSexo())
                .setInteger(4,liquidacion.getIdServicio())
                .setInteger(5,liquidacion.getIdgrupoEdad())
                .setInteger(6,liquidacion.getIdtipoPoblacion());        
                
         
         if(q.list().size()>0){
             cant=false;
         }
         
        
        return cant;
    }

    @Override
    public List<GrupoEdadVO> traerGruposEdad(String edad) throws SQLException, NamingException{
         ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        List<GrupoEdadVO> lista = new ArrayList<GrupoEdadVO>();
        
        
        String ed = edad.substring(0,edad.length()-1);
        String med = edad.substring(edad.length()-1, edad.length());
        
                 String sql = "select id"                         
                         + " from tb_grupoedad"
                         + " where "+ed+" between substring(edad_inicio from 1 for char_length(edad_inicio)-1)::integer"
                         + " AND "
                         + "Substring(edad_final from 1 for char_length(edad_final)-1)::integer"
                         + " AND substring(edad_inicio from length(edad_inicio) for 2 ) = '"+med+"'";
    
                 PreparedStatement stmt = conn.prepareStatement(sql);
        try {
            ResultSet res = stmt.executeQuery();
            try {
                while (res.next()) {
                    GrupoEdadVO grupoedad = new GrupoEdadVO();
                    grupoedad.setId(res.getInt("id"));                    
                    lista.add(grupoedad);

                }
            } finally {
                res.close();
            }
        } finally {
            stmt.close();
           if (!conn.isClosed())
               conn.close();
        }

        return lista;
    
    
    }

    @Override
    public void actualizarCitaFactura(int idFactura, int idCita) throws SQLException, NamingException {
        ConexionDb con = new ConexionDb();
        Connection conn;
        conn = con.traerConexion();

        String sql ="UPDATE tb_citamedica"+
                    " SET id_factura=?"+
                    " WHERE tb_citamedica.id=?";

		PreparedStatement stmt = conn.prepareStatement(sql);

                stmt.setInt(1,idFactura);
                stmt.setInt(2,idCita);
                stmt.execute();
		stmt.close();
                if (!conn.isClosed())
               conn.close();
    }
    @Override
     public void liquidarFactura(int idAdmision)throws SQLException, NamingException{
         
     }
    
}
